iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0
Modern Web

蓋一個自己的 Nuxt 3 UI Module系列 第 22

extendPages-快速加入頁面

  • 分享至 

  • xImage
  •  

昨天成功引入了 button 元件的頁面 👍

回過頭來看看還有 12345…..好多個頁面要引入呀……
一個一個引入感覺有點麻煩…… (:3 」∠ )

可惜目前沒有像 components 一樣,有可以直接引入資料夾的方法 QQ

但我們可以借助 Node.js 檔案系統,抓取目錄下的檔案,再用 for 迴圈引入!

Step 1: 引入 fs

import fs from 'node:fs'

Step 2: 使用 fs.readdir 或是 fs.readdirSync 讀取資料夾下的內容,兩者的區別在於 readdir 是非同步的必須提供一個回傳函式,兩者皆會回傳查詢資料夾下的檔案,並用 array 包起來。

  • fs.readdir

    // module.ts
    const files = fs.readdir(resolver.resolve('./runtime/pages/demo'), (err, files) => {
          if (err) {
            console.error(err)
            return
          }
          console.log(files)
        })
    
    // log 出來的內容
    [ 'button.vue',                                                                                                                                                                下午11:46:58
      'checkbox.vue',
      'id.vue',
      'input.vue',
      'radio.vue',
      'select.vue',
      'switch.vue',
      'tab.vue',
      'tooltip.vue' ]
    
  • fs.readdirSync

    // module.ts
    const files = fs.readdirSync(resolver.resolve('./runtime/pages/demo'))
    
    extendPages((pages) => {
          console.log(files);
    }
    
    // log 出來的內容
    [ 'button.vue',                                                                                                                                                                下午11:46:58
      'checkbox.vue',
      'id.vue',
      'input.vue',
      'radio.vue',
      'select.vue',
      'switch.vue',
      'tab.vue',
      'tooltip.vue' ]
    

step 3: 成功讀到資料夾下內容後就可以嘗試引入 page 啦!

這邊要注意如果有設定 name 名稱的話,可以加上前綴字避免有重複名稱的可能性。

// module.ts
const files = fs.readdirSync(resolver.resolve('./runtime/pages/demo'))

extendPages((pages) => {
	pages.push({
        name: 'demo',
        file: resolver.resolve('./runtime/pages/demo.vue'),
        path: '/demo',
      })
	files.forEach((demoPage) => {
        pages.push({
          name: `demo-${demoPage}`.replace('.vue', ''),
          file: resolver.resolve(`./runtime/pages/demo/${demoPage}`),
          path: `/demo/${demoPage.replace('.vue', '')}`,
        })
      })
    })

step 4: 最後別忘了處理動態路由

files.forEach((demoPage) => {
        if (demoPage === '[id].vue') {
          pages.push({
            name: 'demo-id',
            file: resolver.resolve(`./runtime/pages/demo/${demoPage}`),
            path: `/demo/:id`,
          })
          return
        }
        pages.push({
          name: `demo-${demoPage}`.replace('.vue', ''),
          file: resolver.resolve(`./runtime/pages/demo/${demoPage}`),
          path: `/demo/${demoPage.replace('.vue', '')}`,
        })
      })

完成後打開 devtool 就可以看到引入的頁面嚕


Node.JS - 30 天入門學習筆記 - Node.js 檔案系統: https://ithelp.ithome.com.tw/articles/10185422


上一篇
extendPages
下一篇
addLayout
系列文
蓋一個自己的 Nuxt 3 UI Module30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言